This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

source("tianfengRwrappers.R")
library(future)
plan("multiprocess",workers = 8)
CA_dataset2 <- readRDS("CA_dataset2.rds")
CA_dataset1 <- readRDS("CA_dataset1.rds")
human_coronary <- readRDS("human_coronary.rds")
Idents(human_coronary) <- human_coronary$samples
human_coronary <- RenameIdents(human_coronary,'1' = 'sample1','2' = 'sample2','3' = 'sample3','4' = 'sample4')
human_coronary$samples <- Idents(human_coronary)
Idents(human_coronary) <- human_coronary$Classification1
ds2 <- readRDS("ds2.rds")

#sample info

ggsave("dataset2_sampleinfo.svg",plot = umapplot(CA_dataset2, split.by = "sample"), 
       device = svg, width = 25, height = 5)
ggsave("dataset1_sampleinfo.svg",plot = umapplot(CA_dataset1, split.by = "orig.ident"),
       device = svg, width = 15, height = 5)
ggsave("dataset0_sampleinfo.svg",plot = umapplot(human_coronary, split.by = "samples"),
       device = svg, width = 20, height = 5)

附图:所有marker基因表达热图 show 表达量最高的top5

logfc.threshold = 0.5, min.diff.pct = 0.3 pct.1>0.7

dataset2

svg(paste0("CA_dataset2_supp","_markers.svg"), height = 10, width = 15)
dhm2(CA_dataset2_markers$gene, CA_dataset2, genes_to_show$gene,"CA_dataset2_supp")
dev.off()
null device 
          1 

dataset1

svg(paste0("CA_dataset1_supp","_markers.svg"), height = 10, width = 15)
dhm2(CA_dataset1_markers$gene, CA_dataset1, genes_to_show$gene,"CA_dataset1_supp")
dev.off()
null device 
          1 

dataset0

human_coronary_markers <- FindAllMarkers(human_coronary, logfc.threshold = 0.5, min.diff.pct = 0.3, only.pos = T)
Calculating cluster FB
Calculating cluster Macrophage
Calculating cluster EC
Calculating cluster SMC
Calculating cluster T cell
Calculating cluster B cell
Calculating cluster Neuron
Calculating cluster Plasma
human_coronary_markers <- human_coronary_markers[human_coronary_markers$pct.1>0.7,] %>% group_by(cluster) 

genes_to_show <- human_coronary_markers %>% group_by(cluster) %>% slice_max(n = 5, order_by = avg_logFC)

svg(paste0("human_coronary_supp","_markers.svg"), height = 10, width = 15)
dhm2(human_coronary_markers$gene, human_coronary, genes_to_show$gene,"human_coronary_supp")
dev.off()
RStudioGD 
        2 

样本细胞比例

prop_plot <- ggplot(plot_data, aes(x = `cell type`, y = proportion, fill = position)) + 
  geom_bar(stat = 'identity', position = "dodge", width=0.7) + coord_cartesian(ylim = c(0,0.3))+
  theme_bw() + scale_y_continuous(expand = c(0,0)) + scale_fill_manual(values = colors_list[1:4]))+theme(
错误: 意外的')' in:
"  geom_bar(stat = 'identity', position = "dodge", width=0.7) + coord_cartesian(ylim = c(0,0.3))+
  theme_bw() + scale_y_continuous(expand = c(0,0)) + scale_fill_manual(values = colors_list[1:4]))"

XGBoost feature

pretrain

fea <- read.csv("./datatable/AC_features.csv")
ggobj <- multi_featureplot(fea$Feature[1:16],ds2_AC,labels = "",label = F)
ggsave("ACpretrain_features.png", device = png, plot = ggobj, width = 8, height = 8)

fea <- read.csv("./datatable/PA_features.csv")
ggobj <- multi_featureplot(fea$Feature[1:16],ds2_PA,labels = "",label = F)
ggsave("PApretrain_features.png", device = png, plot = ggobj, width = 8, height = 8)

model

fea <- read.csv("./datatable/ACtrain_features.csv")
ggobj <- multi_featureplot(fea$Feature[1:16],ds2_AC,labels = "",label = F)
ggsave("ACmodel_features.png", device = png, plot = ggobj, width = 8, height = 8)

fea <- read.csv("./datatable/PAtrain_features.csv")
ggobj <- multi_featureplot(fea$Feature[1:16],ds2_PA,labels = "",label = F)
ggsave("PAmodel_features.png", device = png, plot = ggobj, width = 8, height = 8)

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ3RybCtTaGlmdCtFbnRlciouIAoKYGBge3J9CnNvdXJjZSgidGlhbmZlbmdSd3JhcHBlcnMuUiIpCmxpYnJhcnkoZnV0dXJlKQpwbGFuKCJtdWx0aXByb2Nlc3MiLHdvcmtlcnMgPSA4KQpgYGAKCmBgYHtyfQpDQV9kYXRhc2V0MiA8LSByZWFkUkRTKCJDQV9kYXRhc2V0Mi5yZHMiKQpDQV9kYXRhc2V0MSA8LSByZWFkUkRTKCJDQV9kYXRhc2V0MS5yZHMiKQpodW1hbl9jb3JvbmFyeSA8LSByZWFkUkRTKCJodW1hbl9jb3JvbmFyeS5yZHMiKQpJZGVudHMoaHVtYW5fY29yb25hcnkpIDwtIGh1bWFuX2Nvcm9uYXJ5JHNhbXBsZXMKaHVtYW5fY29yb25hcnkgPC0gUmVuYW1lSWRlbnRzKGh1bWFuX2Nvcm9uYXJ5LCcxJyA9ICdzYW1wbGUxJywnMicgPSAnc2FtcGxlMicsJzMnID0gJ3NhbXBsZTMnLCc0JyA9ICdzYW1wbGU0JykKaHVtYW5fY29yb25hcnkkc2FtcGxlcyA8LSBJZGVudHMoaHVtYW5fY29yb25hcnkpCklkZW50cyhodW1hbl9jb3JvbmFyeSkgPC0gaHVtYW5fY29yb25hcnkkQ2xhc3NpZmljYXRpb24xCmRzMiA8LSByZWFkUkRTKCJkczIucmRzIikKYGBgCgojc2FtcGxlIGluZm8KYGBge3J9Cmdnc2F2ZSgiZGF0YXNldDJfc2FtcGxlaW5mby5zdmciLHBsb3QgPSB1bWFwcGxvdChDQV9kYXRhc2V0Miwgc3BsaXQuYnkgPSAic2FtcGxlIiksIAogICAgICAgZGV2aWNlID0gc3ZnLCB3aWR0aCA9IDI1LCBoZWlnaHQgPSA1KQpnZ3NhdmUoImRhdGFzZXQxX3NhbXBsZWluZm8uc3ZnIixwbG90ID0gdW1hcHBsb3QoQ0FfZGF0YXNldDEsIHNwbGl0LmJ5ID0gIm9yaWcuaWRlbnQiKSwKICAgICAgIGRldmljZSA9IHN2Zywgd2lkdGggPSAxNSwgaGVpZ2h0ID0gNSkKZ2dzYXZlKCJkYXRhc2V0MF9zYW1wbGVpbmZvLnN2ZyIscGxvdCA9IHVtYXBwbG90KGh1bWFuX2Nvcm9uYXJ5LCBzcGxpdC5ieSA9ICJzYW1wbGVzIiksCiAgICAgICBkZXZpY2UgPSBzdmcsIHdpZHRoID0gMjAsIGhlaWdodCA9IDUpCgpgYGAKCgojIOmZhOWbvu+8muaJgOaciW1hcmtlcuWfuuWboOihqOi+vueDreWbviBzaG93IOihqOi+vumHj+acgOmrmOeahHRvcDUKIyMjIGxvZ2ZjLnRocmVzaG9sZCA9IDAuNSwgbWluLmRpZmYucGN0ID0gMC4zIHBjdC4xPjAuNwpkYXRhc2V0MgpgYGB7cn0KQ0FfZGF0YXNldDJfbWFya2VycyA8LSBGaW5kQWxsTWFya2VycyhDQV9kYXRhc2V0MiwgbG9nZmMudGhyZXNob2xkID0gMC41LCBtaW4uZGlmZi5wY3QgPSAwLjMsIG9ubHkucG9zID0gVCkKQ0FfZGF0YXNldDJfbWFya2VycyA8LSBDQV9kYXRhc2V0Ml9tYXJrZXJzW0NBX2RhdGFzZXQyX21hcmtlcnMkcGN0LjE+MC43LF0gJT4lIGdyb3VwX2J5KGNsdXN0ZXIpIAoKZ2VuZXNfdG9fc2hvdyA8LSBDQV9kYXRhc2V0Ml9tYXJrZXJzICU+JSBncm91cF9ieShjbHVzdGVyKSAlPiUgc2xpY2VfbWF4KG4gPSA1LCBvcmRlcl9ieSA9IGF2Z19sb2dGQykKCnN2ZyhwYXN0ZTAoIkNBX2RhdGFzZXQyX3N1cHAiLCJfbWFya2Vycy5zdmciKSwgaGVpZ2h0ID0gMTAsIHdpZHRoID0gMTUpCmRobTIoQ0FfZGF0YXNldDJfbWFya2VycyRnZW5lLCBDQV9kYXRhc2V0MiwgZ2VuZXNfdG9fc2hvdyRnZW5lLCJDQV9kYXRhc2V0Ml9zdXBwIikKZGV2Lm9mZigpCmBgYApkYXRhc2V0MQpgYGB7cn0KQ0FfZGF0YXNldDFfbWFya2VycyA8LSBGaW5kQWxsTWFya2VycyhDQV9kYXRhc2V0MSwgbG9nZmMudGhyZXNob2xkID0gMC41LCBtaW4uZGlmZi5wY3QgPSAwLjMsIG9ubHkucG9zID0gVCkKQ0FfZGF0YXNldDFfbWFya2VycyA8LSBDQV9kYXRhc2V0MV9tYXJrZXJzW0NBX2RhdGFzZXQxX21hcmtlcnMkcGN0LjE+MC43LF0gJT4lIGdyb3VwX2J5KGNsdXN0ZXIpIAoKZ2VuZXNfdG9fc2hvdyA8LSBDQV9kYXRhc2V0MV9tYXJrZXJzICU+JSBncm91cF9ieShjbHVzdGVyKSAlPiUgc2xpY2VfbWF4KG4gPSA1LCBvcmRlcl9ieSA9IGF2Z19sb2dGQykKCnN2ZyhwYXN0ZTAoIkNBX2RhdGFzZXQxX3N1cHAiLCJfbWFya2Vycy5zdmciKSwgaGVpZ2h0ID0gMTAsIHdpZHRoID0gMTUpCmRobTIoQ0FfZGF0YXNldDFfbWFya2VycyRnZW5lLCBDQV9kYXRhc2V0MSwgZ2VuZXNfdG9fc2hvdyRnZW5lLCJDQV9kYXRhc2V0MV9zdXBwIikKZGV2Lm9mZigpCmBgYAoKCmRhdGFzZXQwCmBgYHtyfQpodW1hbl9jb3JvbmFyeV9tYXJrZXJzIDwtIEZpbmRBbGxNYXJrZXJzKGh1bWFuX2Nvcm9uYXJ5LCBsb2dmYy50aHJlc2hvbGQgPSAwLjUsIG1pbi5kaWZmLnBjdCA9IDAuMywgb25seS5wb3MgPSBUKQpodW1hbl9jb3JvbmFyeV9tYXJrZXJzIDwtIGh1bWFuX2Nvcm9uYXJ5X21hcmtlcnNbaHVtYW5fY29yb25hcnlfbWFya2VycyRwY3QuMT4wLjcsXSAlPiUgZ3JvdXBfYnkoY2x1c3RlcikgCgpnZW5lc190b19zaG93IDwtIGh1bWFuX2Nvcm9uYXJ5X21hcmtlcnMgJT4lIGdyb3VwX2J5KGNsdXN0ZXIpICU+JSBzbGljZV9tYXgobiA9IDUsIG9yZGVyX2J5ID0gYXZnX2xvZ0ZDKQoKc3ZnKHBhc3RlMCgiaHVtYW5fY29yb25hcnlfc3VwcCIsIl9tYXJrZXJzLnN2ZyIpLCBoZWlnaHQgPSAxMCwgd2lkdGggPSAxNSkKZGhtMihodW1hbl9jb3JvbmFyeV9tYXJrZXJzJGdlbmUsIGh1bWFuX2Nvcm9uYXJ5LCBnZW5lc190b19zaG93JGdlbmUsImh1bWFuX2Nvcm9uYXJ5X3N1cHAiKQpkZXYub2ZmKCkKYGBgCiMg5qC35pys57uG6IOe5q+U5L6LCmBgYHtyfQpJZGVudHMoaHVtYW5fY29yb25hcnkpIDwtIGh1bWFuX2Nvcm9uYXJ5JGNvbmRpdGlvbnMKc3AxIDwtIHN1YnNldChodW1hbl9jb3JvbmFyeSwgaWRlbnRzID0gInNhbXBsZTEiKQpzcDIgPC0gc3Vic2V0KGh1bWFuX2Nvcm9uYXJ5LCBpZGVudHMgPSAic2FtcGxlMiIpCnNwMyA8LSBzdWJzZXQoaHVtYW5fY29yb25hcnksIGlkZW50cyA9ICJzYW1wbGUzIikKc3A0IDwtIHN1YnNldChodW1hbl9jb3JvbmFyeSwgaWRlbnRzID0gInNhbXBsZTQiKQpwcm9wX21hdCA8LSBjYmluZChwcm9wLnRhYmxlKHRhYmxlKHNwMSRDbGFzc2lmaWNhdGlvbjEpKSxwcm9wLnRhYmxlKHRhYmxlKHNwMiRDbGFzc2lmaWNhdGlvbjEpKSkKcHJvcF9tYXQyIDwtIGNiaW5kKHByb3AudGFibGUodGFibGUoc3AzJENsYXNzaWZpY2F0aW9uMSkpLHByb3AudGFibGUodGFibGUoc3A0JENsYXNzaWZpY2F0aW9uMSkpKQpwcm9wX21hdCA8LSBjYmluZChwcm9wX21hdCwgcHJvcF9tYXQyKQpjb2xuYW1lcyhwcm9wX21hdCkgPC0gbGV2ZWxzKElkZW50cyhodW1hbl9jb3JvbmFyeSkpCgoKcGxvdF9kYXRhID0gbWVsdChwcm9wX21hdCkKY29sbmFtZXMocGxvdF9kYXRhKSA9IGMoJ2NlbGwgdHlwZScsJ3Bvc2l0aW9uJywncHJvcG9ydGlvbicpI+S/ruaUueavj+S4gOWIl+eahOWQjeensAoKZ2dwbG90KHBsb3RfZGF0YSwgYWVzKHggPSBgY2VsbCB0eXBlYCwgeSA9IHByb3BvcnRpb24sIGZpbGwgPSBwb3NpdGlvbikpICsgCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScsIHBvc2l0aW9uID0gImRvZGdlIiwgd2lkdGg9MC41KSArIHRoZW1lX2J3KCkKCnByb3BfcGxvdCA8LSBnZ3Bsb3QocGxvdF9kYXRhLCBhZXMoeCA9IGBjZWxsIHR5cGVgLCB5ID0gcHJvcG9ydGlvbiwgZmlsbCA9IHBvc2l0aW9uKSkgKyAKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JywgcG9zaXRpb24gPSAiZG9kZ2UiLCB3aWR0aD0wLjcpICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsMC4zKSkrCiAgdGhlbWVfYncoKSArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCkpICsgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JzX2xpc3RbMzo2XSkgK3RoZW1lKAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSwgY29sb3VyID0gImJsYWNrIiksCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1LCBjb2xvdXIgPSAiYmxhY2siKSwKICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKCmdnc2F2ZSgiaHVtYW5fY29yb25hcnlfcHJvcC5zdmciLCBkZXZpY2UgPSBzdmcsIHBsb3QgPSBwcm9wX3Bsb3QsIHdpZHRoID0gMTIsIGhlaWdodCA9IDYpCgpgYGAKCgpgYGB7cn0KSWRlbnRzKENBX2RhdGFzZXQxKSA8LSBDQV9kYXRhc2V0MSRvcmlnLmlkZW50CklkZW50cyhDQV9kYXRhc2V0MSkgPC0gYygic2FtcGxlMSIsInNhbXBsZTIiLCJzYW1wbGUzIikKCnNwMSA8LSBzdWJzZXQoQ0FfZGF0YXNldDEsIGlkZW50cyA9ICJzYW1wbGUxIikKc3AyIDwtIHN1YnNldChDQV9kYXRhc2V0MSwgaWRlbnRzID0gInNhbXBsZTIiKQpzcDMgPC0gc3Vic2V0KENBX2RhdGFzZXQxLCBpZGVudHMgPSAic2FtcGxlMyIpCnByb3BfbWF0IDwtIGNiaW5kKHByb3AudGFibGUodGFibGUoc3AxJENsYXNzaWZpY2F0aW9uMSkpLHByb3AudGFibGUodGFibGUoc3AyJENsYXNzaWZpY2F0aW9uMSkpLHByb3AudGFibGUodGFibGUoc3AzJENsYXNzaWZpY2F0aW9uMSkpKQoKY29sbmFtZXMocHJvcF9tYXQpIDwtIGxldmVscyhJZGVudHMoQ0FfZGF0YXNldDEpKQoKCnBsb3RfZGF0YSA9IG1lbHQocHJvcF9tYXQpCmNvbG5hbWVzKHBsb3RfZGF0YSkgPSBjKCdjZWxsIHR5cGUnLCdwb3NpdGlvbicsJ3Byb3BvcnRpb24nKSPkv67mlLnmr4/kuIDliJfnmoTlkI3np7AKCmdncGxvdChwbG90X2RhdGEsIGFlcyh4ID0gYGNlbGwgdHlwZWAsIHkgPSBwcm9wb3J0aW9uLCBmaWxsID0gcG9zaXRpb24pKSArIAogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknLCBwb3NpdGlvbiA9ICJkb2RnZSIsIHdpZHRoPTAuNSkgKyB0aGVtZV9idygpCgpwcm9wX3Bsb3QgPC0gZ2dwbG90KHBsb3RfZGF0YSwgYWVzKHggPSBgY2VsbCB0eXBlYCwgeSA9IHByb3BvcnRpb24sIGZpbGwgPSBwb3NpdGlvbikpICsgCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScsIHBvc2l0aW9uID0gImRvZGdlIiwgd2lkdGg9MC43KSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDAuNikpKwogIHRoZW1lX2J3KCkgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApKSArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yc19saXN0WzM6Nl0pICt0aGVtZSgKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGNvbG91ciA9ICJibGFjayIpLAogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSwgY29sb3VyID0gImJsYWNrIiksCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApLCBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCgpnZ3NhdmUoIkNBX2RhdGFzZXQxX3Byb3Auc3ZnIiwgZGV2aWNlID0gc3ZnLCBwbG90ID0gcHJvcF9wbG90LCB3aWR0aCA9IDEyLCBoZWlnaHQgPSA2KQpgYGAKCgojIyBYR0Jvb3N0IGZlYXR1cmUKcHJldHJhaW4KYGBge3IgZmlnLndpZHRoPTYsZmlnLmhlaWdodD02fQpmZWEgPC0gcmVhZC5jc3YoIi4vZGF0YXRhYmxlL0FDX2ZlYXR1cmVzLmNzdiIpCmdnb2JqIDwtIG11bHRpX2ZlYXR1cmVwbG90KGZlYSRGZWF0dXJlWzE6MTZdLGRzMl9BQyxsYWJlbHMgPSAiIixsYWJlbCA9IEYpCmdnc2F2ZSgiQUNwcmV0cmFpbl9mZWF0dXJlcy5wbmciLCBkZXZpY2UgPSBwbmcsIHBsb3QgPSBnZ29iaiwgd2lkdGggPSA4LCBoZWlnaHQgPSA4KQoKZmVhIDwtIHJlYWQuY3N2KCIuL2RhdGF0YWJsZS9QQV9mZWF0dXJlcy5jc3YiKQpnZ29iaiA8LSBtdWx0aV9mZWF0dXJlcGxvdChmZWEkRmVhdHVyZVsxOjE2XSxkczJfUEEsbGFiZWxzID0gIiIsbGFiZWwgPSBGKQpnZ3NhdmUoIlBBcHJldHJhaW5fZmVhdHVyZXMucG5nIiwgZGV2aWNlID0gcG5nLCBwbG90ID0gZ2dvYmosIHdpZHRoID0gOCwgaGVpZ2h0ID0gOCkKYGBgCgptb2RlbApgYGB7ciBmaWcud2lkdGg9NixmaWcuaGVpZ2h0PTZ9CmZlYSA8LSByZWFkLmNzdigiLi9kYXRhdGFibGUvQUN0cmFpbl9mZWF0dXJlcy5jc3YiKQpnZ29iaiA8LSBtdWx0aV9mZWF0dXJlcGxvdChmZWEkRmVhdHVyZVsxOjE2XSxkczJfQUMsbGFiZWxzID0gIiIsbGFiZWwgPSBGKQpnZ3NhdmUoIkFDbW9kZWxfZmVhdHVyZXMucG5nIiwgZGV2aWNlID0gcG5nLCBwbG90ID0gZ2dvYmosIHdpZHRoID0gOCwgaGVpZ2h0ID0gOCkKCmZlYSA8LSByZWFkLmNzdigiLi9kYXRhdGFibGUvUEF0cmFpbl9mZWF0dXJlcy5jc3YiKQpnZ29iaiA8LSBtdWx0aV9mZWF0dXJlcGxvdChmZWEkRmVhdHVyZVsxOjE2XSxkczJfUEEsbGFiZWxzID0gIiIsbGFiZWwgPSBGKQpnZ3NhdmUoIlBBbW9kZWxfZmVhdHVyZXMucG5nIiwgZGV2aWNlID0gcG5nLCBwbG90ID0gZ2dvYmosIHdpZHRoID0gOCwgaGVpZ2h0ID0gOCkKYGBgCgoKICAgIApBZGQgYSBuZXcgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpJbnNlcnQgQ2h1bmsqIGJ1dHRvbiBvbiB0aGUgdG9vbGJhciBvciBieSBwcmVzc2luZyAqQ3RybCtBbHQrSSouCgpXaGVuIHlvdSBzYXZlIHRoZSBub3RlYm9vaywgYW4gSFRNTCBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvZGUgYW5kIG91dHB1dCB3aWxsIGJlIHNhdmVkIGFsb25nc2lkZSBpdCAoY2xpY2sgdGhlICpQcmV2aWV3KiBidXR0b24gb3IgcHJlc3MgKkN0cmwrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4KClRoZSBwcmV2aWV3IHNob3dzIHlvdSBhIHJlbmRlcmVkIEhUTUwgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvci4gQ29uc2VxdWVudGx5LCB1bmxpa2UgKktuaXQqLCAqUHJldmlldyogZG9lcyBub3QgcnVuIGFueSBSIGNvZGUgY2h1bmtzLiBJbnN0ZWFkLCB0aGUgb3V0cHV0IG9mIHRoZSBjaHVuayB3aGVuIGl0IHdhcyBsYXN0IHJ1biBpbiB0aGUgZWRpdG9yIGlzIGRpc3BsYXllZC4K